/**
 * 
 */
package co.com.travelsoft.ati.administrador.interfaz;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.table.AbstractTableModel;

import co.com.travelsoft.ati.administrador.DelegadoNegocio;
import co.com.travelsoft.ati.dto.CiudadDto;
import co.com.travelsoft.ati.dto.PaisDto;
import co.com.travelsoft.ati.entities.EventoDto;
import co.com.travelsoft.ati.exception.TravelSoftException;

/**
 * @author ELIAS
 *
 */
public class PanelConsultaEventos extends JPanel implements ActionListener, ItemListener{

	private JLabel paisLabel;
	private JComboBox paisComboBox;
	private JLabel ciudadLabel;
	private JComboBox ciudadComboBox;
	private JLabel fechaInicioLabel;
	private JTextField fechaInicioTextField;
	private JLabel fechaFinLabel;
	private JTextField fechaFinTextField;
	
	private JButton consultarButton;
	private JButton crearButton;
	
	private JTable listaEventosTable;
	
	private JButton modificarButton;
	private JButton eliminarButton;
	
	private DelegadoNegocio delegado;
	private List<EventoDto> eventos;
	private List<PaisDto> listaPaises;
	private Hashtable<BigDecimal,List<CiudadDto>> listasCiudades;
	
	private JFrame ventanaPrincipal;
	
	public PanelConsultaEventos ( JFrame ventanaPrincipal )
	{
		this();
		this.ventanaPrincipal = ventanaPrincipal;
	}
	
	public PanelConsultaEventos ()
	{
		super();
		
		paisLabel = new JLabel("Pais");
		paisComboBox = new JComboBox(new String[]{});
		paisComboBox.addItemListener(this);
		ciudadLabel = new JLabel("Ciudad");
		ciudadComboBox = new JComboBox(new String[]{});
		
		
		fechaInicioLabel = new JLabel("Fecha Inicio");
		fechaInicioTextField = new JTextField(16);
		
		fechaFinLabel = new JLabel("Fecha Fin");
		fechaFinTextField = new JTextField(16);
		JPanel parametrosConsultaPanel = new JPanel();
		parametrosConsultaPanel.setLayout(new GridLayout(2, 4,5, 5));
		parametrosConsultaPanel.add(paisLabel);
		parametrosConsultaPanel.add(paisComboBox);
		parametrosConsultaPanel.add(ciudadLabel);
		parametrosConsultaPanel.add(ciudadComboBox);
		parametrosConsultaPanel.add(fechaInicioLabel);
		parametrosConsultaPanel.add(fechaInicioTextField);
		parametrosConsultaPanel.add(fechaFinLabel);
		parametrosConsultaPanel.add(fechaFinTextField);
		//parametrosConsultaPanel.setSize(300, 200);
		
		
		
		consultarButton = new JButton("Consultar");
		consultarButton.addActionListener(this);
		crearButton = new JButton("Crear");
		crearButton.addActionListener(this);
		
		JPanel botonesConsultaPanel = new JPanel();
		botonesConsultaPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		botonesConsultaPanel.add(consultarButton);
		botonesConsultaPanel.add(crearButton);
		
		JPanel parametrosBotonesConsultaPanel = new JPanel();
		parametrosBotonesConsultaPanel.setLayout(new BorderLayout(5, 5));
		parametrosBotonesConsultaPanel.add(parametrosConsultaPanel, BorderLayout.CENTER);
		parametrosBotonesConsultaPanel.add(botonesConsultaPanel, BorderLayout.SOUTH);
		TitledBorder titledBorder = new TitledBorder("Consulta de eventos");
		parametrosBotonesConsultaPanel.setBorder(titledBorder);
		
		
		
		
		
		//listaEventosTable = new JTable(datos, nombresColumnas);
		listaEventosTable = new JTable(new PanelConsultaEventos.ModeloTablaEventos());
		listaEventosTable.setFillsViewportHeight(true);
		JScrollPane scrollPane = new JScrollPane(listaEventosTable);
		
		
		modificarButton = new JButton("Modificar");
		modificarButton.addActionListener(this);
		eliminarButton = new JButton("Eliminar");
		eliminarButton.addActionListener(this);
		JPanel modificacionEventosPanel = new JPanel();
		modificacionEventosPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		modificacionEventosPanel.add(modificarButton);
		modificacionEventosPanel.add(eliminarButton);
		
		
		setLayout(new BorderLayout(5,5));
		add(listaEventosTable.getTableHeader(), BorderLayout.PAGE_START);
		add(parametrosBotonesConsultaPanel, BorderLayout.NORTH);
		add(scrollPane, BorderLayout.CENTER);
		add(modificacionEventosPanel, BorderLayout.SOUTH);
		
		
		delegado = DelegadoNegocio.getInstancia();
		
		//setSize(300, 200);
		//setVisible(true);
		
		cargarComboPaises();
		cargarComboCiudades();
		
	}
	
	public void cargarComboPaises()
	{
		try {
			listaPaises = delegado.listarPaises();
			DefaultComboBoxModel items = new DefaultComboBoxModel();
			for ( PaisDto pais : listaPaises )
				items.addElement(pais.getNombre());
			
			paisComboBox.setModel(items);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "No se pudo listar los paises.");
			e.printStackTrace();
		}
	}
	
	public void cargarComboCiudades()
	{
		try {
			if ( listasCiudades == null ) {
				// Inicializa la matriz de ciudades por pais
				listasCiudades = new Hashtable<BigDecimal, List<CiudadDto>>();
				
				// Crea una lista vacia de ciudades por cada pais
				for ( PaisDto pais : listaPaises )
					listasCiudades.put(pais.getCodigo(), new ArrayList<CiudadDto>());
				
				// Llena la listas de ciudades de cada pais
				List<CiudadDto> listaTodasLasCiudades = delegado.listarCiudadesDePais();
				for ( CiudadDto ciudad : listaTodasLasCiudades ) {
					listasCiudades.get(ciudad.getPaises().getCodigo()).add(ciudad); 
				}
			}
			
			//Pais seleccionado
			int indicePaisSeleccionado = paisComboBox.getSelectedIndex();
			System.out.println("Ind: "+ indicePaisSeleccionado );
			PaisDto paisSeleccionado = listaPaises.get(indicePaisSeleccionado);
			System.out.println("pais: "+ paisSeleccionado.getNombre() );
			List<CiudadDto> listaCiudadesPaisSeleccionado = listasCiudades.get(paisSeleccionado.getCodigo());
			System.out.println("ciudades: "+ listaCiudadesPaisSeleccionado.toString() );
			
			DefaultComboBoxModel items = new DefaultComboBoxModel();
			for ( CiudadDto pais : listaCiudadesPaisSeleccionado )
				items.addElement(pais.getNombre());
			
			ciudadComboBox.setModel(items);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "No se pudo listar las ciudades.");
			e.printStackTrace();
		}
	}
	
	class ModeloTablaEventos extends AbstractTableModel {
		
		private String[] nombresColumnas = new String[]{
				"Seleccionar",
                "Codigo",
                "Tipo Evento",
                "Pais",
                "Ciudad",
                "Nombre"};
		
		private List<EventoDto> eventos;
		
		public ModeloTablaEventos(){
			this(new ArrayList<EventoDto>());
		}
		
		public ModeloTablaEventos(List<EventoDto> eventos){
			//this.nombresColumnas = nombresColumnas;
			this.eventos = eventos;
		}
		
		public String getColumnName(int col) {
	        return nombresColumnas[col].toString();
	    }
	    
	    public int getRowCount() { 
	    	return eventos.size(); 
	    }
	    
	    public int getColumnCount() { 
	    	return nombresColumnas.length; 
	    }
	    
	    public Class getColumnClass(int c) {
	    	if ( getValueAt(0, c) == null )
	    		return String.class;
	    	else
	    		return getValueAt(0, c).getClass();
	    }
	    
	    public Object getValueAt(int row, int col) {
	        Object datoCelda = null;
	        System.out.println(row+" "+col);
	        switch ( col ) {
	        	case 0: 
	        		datoCelda = false;
	        		break;
	        	case 1: 
	        		datoCelda = eventos.get(row).getCodigo();
	        		break;
	        	case 2: 
	        		//datoCelda = eventos.get(row).getTipoEvento().getNombre();
	        		datoCelda = "";
	        		break;
	        	case 3:
	        		//datoCelda = eventos.get(row).get
	        		datoCelda = paisComboBox.getSelectedItem().toString();
	        		//datoCelda = "";
	        		break;
	        	case 4:
	        		//datoCelda = eventos.get(row).get
	        		datoCelda = ciudadComboBox.getSelectedItem().toString();
	        		//datoCelda = "";
	        		break;
	        	case 5: 
	        		datoCelda = eventos.get(row).getNombre();
	        		break;
	        	default: JOptionPane.showMessageDialog(null, "Error: columan no disponible.");
	        };
	        
	    	return datoCelda;
	    }
	    public boolean isCellEditable(int row, int col){ 
	    	return false;
	    }
	    public void setValueAt(Object value, int row, int col) {
	        //datos[row][col] = value;
	        fireTableCellUpdated(row, col);
	    }
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		if ( e.getSource() == consultarButton ) {
			try {
				eventos = delegado.consultarEventos();
				listaEventosTable.setModel(new PanelConsultaEventos.ModeloTablaEventos(eventos));
				System.out.println(eventos.size());
			} catch (TravelSoftException e1) {
				e1.printStackTrace();
				JOptionPane.showMessageDialog(null, "Error en la consulta de eventos: "+e1.getMessage());
			}
		}
		//else if ( e.getSource() == crearButton ) {
		//	
		//}
		//else if ( e.getSource() == modificarButton ) {
		//	
		//}
		//else if ( e.getSource() == eliminarButton ) {
		//	JOptionPane.showMessageDialog(null, "Eliminar?");
		//}
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		try {
	        UIManager.setLookAndFeel(
	            UIManager.getSystemLookAndFeelClassName());
	    } catch (Exception e) { }

		
		
		JFrame frame = new JFrame("Consulta Eventos");
		frame.setLayout(new BorderLayout(5,5));
		frame.add(new PanelConsultaEventos());
		frame.setPreferredSize(new Dimension(450, 300));
		frame.pack();
		frame.setVisible(true);
		
		
	}

	@Override
	public void itemStateChanged(ItemEvent evt) {
		// TODO Auto-generated method stub
		if ( evt.getItem().equals(paisComboBox.getSelectedItem())) {
			System.out.println(evt.getSource().toString());
			cargarComboCiudades();
			//ciudadComboBox.repaint();
		}
	}

	

}
